home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / earcd / hardware / galer21.lha / GALer21 / Source / GALer / GALer.c < prev    next >
C/C++ Source or Header  |  1996-04-28  |  46KB  |  1,424 lines

  1. /******************************************************************************
  2. ** GALer.c
  3. *******************************************************************************
  4. **
  5. ** author:   Christian Habermann, (c)1991-96 by Christian Habermann
  6. **           Asamstr. 17
  7. **           85356 Freising
  8. **           Germany
  9. ** version:  2.1
  10. ** date:     27.04.1996
  11. **
  12. ** used compiler: SAS-C 6.51
  13. **
  14. *******************************************************************************
  15. **
  16. ** description:
  17. ** This is the software which is necessary to read/program GALs via
  18. ** GALer's hardware.
  19. **
  20. ** Both the hardware and the software of the GALer project are copyright
  21. ** by Christian Habermann.
  22. **
  23. *******************************************************************************
  24. **
  25. ** changes:
  26. ** date     |     author     |  comment
  27. **          |                |
  28. **          |                |
  29. ******************************************************************************/
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36. /********************************* includes **********************************/
  37.  
  38.  
  39. #define  STRINGARRAY    1
  40.  
  41. #include <libraries/mui.h>
  42.  
  43. #include <devices/parallel.h>
  44. #include <exec/io.h>
  45. #include <exec/memory.h>
  46. #include <exec/ports.h>
  47. #include <exec/types.h>
  48. #include <exec/interrupts.h>
  49. #include <libraries/reqtools.h>
  50. #include <libraries/locale.h>
  51. #include <libraries/gadtools.h>
  52. #include <resources/misc.h>
  53. #include <resources/cia.h>
  54. #include <hardware/cia.h>
  55.  
  56. #include <clib/alib_protos.h>
  57. #include <proto/asl.h>
  58. #include <proto/dos.h>
  59. #include <proto/exec.h>
  60. #include <proto/intuition.h>
  61. #include <proto/locale.h>
  62. #include <proto/muimaster.h>
  63. #include <proto/reqtools.h> 
  64. #include <proto/misc.h>
  65. #include <proto/cia.h>
  66.  
  67. #include <stdlib.h>
  68. #include <string.h>
  69. #include <stdio.h>
  70.  
  71. #include "GALer.h"
  72. #include "Localize.h"
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79. /********************************** defines **********************************/
  80.  
  81. #define REG(x) register __ ## x
  82. #define ASM    __asm
  83. #define SAVEDS __saveds
  84.  
  85. #ifndef MAKE_ID
  86. #define MAKE_ID(a,b,c,d) ((ULONG) (a)<<24 | (ULONG) (b)<<16 | \
  87.                           (ULONG) (c)<<8  | (ULONG) (d))
  88. #endif
  89.  
  90.  
  91. #define ciaa  (*((struct CIA *)0xbfe001))
  92. #define ciab  (*((struct CIA *)0xbfd000))
  93.  
  94.  
  95. #define HELP_FILE       "PROGDIR:Doc/GALer.guide"
  96.  
  97.  
  98.  
  99.  
  100.  
  101. /******************************** functions **********************************/
  102.  
  103. #ifdef LATTICE
  104. int CXBRK(void)    { return(0); }       /* disable Lattice CTRL/C handling */
  105. int chkabort(void) { return(0); }       /* really                          */
  106. #endif
  107.  
  108.  
  109. static void  ExecuteMenu(int menu_id);
  110. static int   GetParPort(void);
  111. static void  FreeParPort(void);
  112. static int   GetCIATimer(void);
  113. static void  FreeCIATimer(void);
  114. static void  dummy_interrupt(void);
  115. static int   GetTimer(void);
  116. static void  FreeTimer(void);
  117. static int   OpenStuff(void);
  118. static void  CloseStuff(void);
  119.  
  120. void main(void);
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127. /******************************** variables **********************************/
  128.  
  129. extern  struct  ReqFileRequester        MyFileReqStruct;
  130.  
  131. extern  struct  NewGadget WriteNGad[], JEDNGad[], AsmNGad[], OptNGad[];
  132. extern  struct  NewGadget RAsm16NGad[], RAsm20NGad[], SelectEditorNGad[];
  133.  
  134. extern  UWORD   WriteGTypes[], JEDGTypes[], AsmGTypes[], OptGTypes[];
  135. extern  UWORD   RAsm16GTypes[], RAsm20GTypes[], SelectEditorGTypes[];
  136.  
  137. extern  ULONG   WriteGTags[], JEDGTags[], AsmGTags[], OptGTags[];
  138. extern  ULONG   RAsm16GTags[], RAsm20GTags[], SelectEditorGTags[];
  139.  
  140. extern  struct  SysBase       *SysBase;        /* let the compiler's autoinit */
  141. extern  struct  GfxBase       *GfxBase;        /* and autotermination code    */
  142. extern  struct  IntuitionBase *IntuitionBase;  /* open/close this libraries   */
  143.  
  144. extern  int     GALType, MaxFuseAdr, SigAdr, hw_version;
  145.  
  146. extern  struct  Configuration   Config;
  147.  
  148. extern  char    *cia_timer_low, *cia_timer_high, *cia_timer_cr;
  149.  
  150. extern  char    cia_timer_start, cia_timer_stop;
  151.  
  152.  
  153.  
  154. struct  IORequest       *CreateExtIO();
  155. struct  Library         *MUIMasterBase;
  156. struct  Library         *LocaleBase;
  157. struct  Library         *MiscBase; 
  158. struct  Library         *CIABase;
  159. struct  ReqToolsBase    *ReqToolsBase;
  160. struct  MsgPort         *timeport;
  161. struct  timerequest     *timereq;
  162. struct  rtFileRequester *filereq;
  163.  
  164. struct  Catalog         *catalog;
  165.  
  166.  
  167.  
  168. static struct Interrupt CIATimerInterrupt =
  169.               {{0, 0, NT_INTERRUPT, 0, "GALer"}, NULL, &dummy_interrupt};
  170.  
  171.  
  172.  
  173. struct NewMenu MainMenu[] =
  174.     {
  175.         /* Project menu */
  176.         NM_TITLE, NULL, NULL, 0, NULL, (APTR)MEN_PROJECT,
  177.         NM_ITEM,  NULL, NULL, 0, 0L,   (APTR)MEN_ABOUT,
  178.         NM_ITEM,  NULL, NULL, 0, NULL, (APTR)MEN_HARDVER,
  179.         NM_SUB, (STRPTR)"V1.0, V1.1", NULL, CHECKIT, 14L, (APTR)MEN_VER11,
  180.         NM_SUB, (STRPTR)"V1.2", NULL, CHECKIT, 13L, (APTR)MEN_VER12,
  181.         NM_SUB, (STRPTR)"V1.3", NULL, CHECKIT, 11L, (APTR)MEN_VER13,
  182.  
  183.     /*  support of elektor's GAL programming device is prepared
  184.         to implement it, add the following line to the source code
  185.         and adjust the menu localisation in the file Localize.c
  186.         NOTE: only the second version of elektor's device is supported !!!
  187.  
  188.         NM_SUB, (STRPTR)"elektor II", NULL, CHECKIT, 7L, (APTR)MEN_VERELEKTOR,
  189.     */
  190.         NM_ITEM,  NULL, NULL, 0, 0L,   (APTR)MEN_SAVECONFIG,
  191.         NM_ITEM,  (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
  192.         NM_ITEM,  NULL, NULL, 0, 0L,   (APTR)MEN_QUIT,
  193.  
  194.         /* GAL-Type menu */
  195.         NM_TITLE, NULL, NULL, 0, NULL, (APTR)MEN_GALTYPE,
  196.         NM_ITEM,  NULL, NULL, CHECKIT, 14L, (APTR)MEN_16V8,
  197.         NM_ITEM,  NULL, NULL, CHECKIT, 13L, (APTR)MEN_20V8,
  198.         NM_ITEM,  NULL, NULL, CHECKIT, 11L, (APTR)MEN_22V10,
  199.         NM_ITEM,  NULL, NULL, CHECKIT,  7L, (APTR)MEN_20RA10,
  200.         NM_ITEM,  (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
  201.         NM_ITEM,  NULL, NULL, CHECKIT|MENUTOGGLE, 0L, (APTR)MEN_TYPEREQ,
  202.  
  203.  
  204.         /* GAL menu */
  205.         NM_TITLE, NULL, NULL, 0, NULL, (APTR)MEN_GAL,
  206.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_PROG,
  207.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_COPY,
  208.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_ERASE,
  209.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_CMP,
  210.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_CLEAR,
  211.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_SETSEC,
  212.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_TESTSEC,
  213.         NM_ITEM,  (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
  214.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_WRITE,
  215.  
  216.         /* GAL-Assembler menu */
  217.         NM_TITLE, NULL, NULL, 0, NULL, (APTR)MEN_GALASM,
  218.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_ASSEMBLE,
  219.  
  220.         /* GAL-Disassembler menu */
  221.         NM_TITLE, NULL, NULL, 0, NULL, (APTR)MEN_GALDIS,
  222.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_READSIG,
  223.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_READACW,
  224.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_READINFO,
  225.         NM_ITEM,  (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
  226.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_READJED,
  227.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_READJEDPARA,
  228.         NM_ITEM,  (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
  229.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_REASM,
  230.  
  231.         /* Tools menu */
  232.         NM_TITLE, NULL, NULL, 0, NULL, (APTR)MEN_TOOLS,
  233.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_SHOWPIN,
  234.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_CLEARPIN,
  235.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_CALLCHECKER,
  236.         NM_ITEM,  (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
  237.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_OPTIMIZER,
  238.         NM_ITEM,  (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
  239.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_EDIT,
  240.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_CALLEDIT,
  241.         NM_ITEM,  (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
  242.         NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_HELP,
  243.         NM_END,   NULL, NULL, 0, 0L, NULL
  244.     };
  245.  
  246.  
  247.  
  248.  
  249.  
  250. static UBYTE prog_name[] = "GALer";
  251.  
  252. static UBYTE version[]   = "$VER: GALer V2.1 (27.04.96)";
  253.  
  254.  
  255. UBYTE  main_win_title[]  = "GALer V2.1  © 1996 by Christian Habermann               GAL16V8   ";
  256.  
  257.  
  258. WORD    selected_timer;
  259.  
  260. int     checker_mode;
  261.  
  262. LONG    __stack = 8192;
  263.  
  264.  
  265.  
  266.  
  267. APTR    app, main_win;
  268.  
  269.  
  270. APTR    menustrip, menu_project, menu_galtype, menu_gal,    /* menu items */
  271.         menu_asm, menu_galdis, menu_tools, menu_checker;
  272.  
  273.  
  274. APTR    GAL_txt[34];                    /* used to store pointers */
  275.                                         /* to the GAL text fields */
  276.  
  277. APTR    GAL_gads[32];                   /* used to store the pointers */
  278.                                         /* to the GAL gadgets         */
  279.  
  280. APTR    LV_text;                        /* list view for text outputs */
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289. void main(void)
  290. {
  291.     ULONG signals, id;
  292.  
  293.  
  294.     if (!OpenStuff())                       /* open libs, windows... */
  295.     {
  296.         CloseStuff();
  297.         exit(20);
  298.     }
  299.  
  300.                                             /* parallel port free? */
  301.  
  302.     if (!GetParPort())
  303.     {
  304.         puts((char *)AppStrings[MSG_ERR_PARPORT].as_Str);
  305.         CloseStuff();
  306.         exit(20);
  307.     }
  308.  
  309.  
  310.                                   /* get any CIA timer */
  311.     if (!GetCIATimer())
  312.     {
  313.         FreeParPort();
  314.         puts((char *)AppStrings[MSG_ERR_CIATIMER].as_Str);
  315.         CloseStuff();
  316.         exit(20);
  317.     }
  318.                                             /* open timer device */
  319.  
  320.  
  321.     if (!GetTimer())
  322.     {
  323.         FreeParPort();
  324.         FreeCIATimer();
  325.         puts((char *)AppStrings[MSG_ERR_TIMER].as_Str);
  326.         CloseStuff();
  327.         exit(20);
  328.     }
  329.  
  330.  
  331.  
  332.  
  333.     InitHardware();                         /* init hardware   */
  334.     EnableOutput();                         /* enable outputs  */
  335.  
  336.     LoadConfig();                           /* load configuration */
  337.  
  338.  
  339.  
  340.     for (;;)
  341.     {
  342.         id = DoMethod(app, MUIM_Application_Input, &signals);
  343.  
  344.                                             /* quit or window's close */
  345.                                             /* gadget selected?       */
  346.         if (id == MEN_QUIT || id == MUIV_Application_ReturnID_Quit)
  347.         {
  348.             if (TxtRequest(AppStrings[MSG_ASKQUIT_TXT].as_Str,
  349.                            AppStrings[MSG_CONT_GAD].as_Str,
  350.                            AppStrings[MSG_CANCEL_GAD].as_Str))
  351.                 break;
  352.         }
  353.                                             /* gadget of the symbolic GAL */
  354.                                             /* selected?                  */
  355.         if (id >= FIRST_GAL_GADID &&
  356.             id < FIRST_GAL_GADID + NUM_OF_GAL_GADGETS &&
  357.             checker_mode == ON)
  358.             Checker(id);
  359.  
  360.                                             /* menu selected? */
  361.         if (id >= FIRST_MENU_ID && id <= LAST_MENU_ID)
  362.             ExecuteMenu(id);
  363.  
  364.  
  365.         if (signals)
  366.             Wait(signals);                  /* wait for next event */
  367.     }
  368.  
  369.  
  370.  
  371.     FreeParPort();                          /* shut down */
  372.  
  373.     FreeCIATimer();
  374.  
  375.     FreeTimer();
  376.  
  377.     CloseStuff();
  378.  
  379.     exit(0);
  380. }
  381.  
  382.  
  383.  
  384.  
  385.  
  386. /******************************************************************************
  387. ** ExecuteMenu()
  388. *******************************************************************************
  389. ** input:   menu_id     ID of the selected menu item
  390. **
  391. ** output:  none
  392. **
  393. ** remarks: does execute the selected menu
  394. ******************************************************************************/
  395.  
  396. static void ExecuteMenu(int menu_id)
  397. {
  398.  
  399.     switch (menu_id)
  400.     {
  401.                                     /* Project menu */
  402.         case MEN_ABOUT:                     /* about */
  403.             About();
  404.             break;
  405.                                             /* hardware versions */
  406.         case MEN_VER11:
  407.             DoMethod(main_win, MUIM_Window_SetMenuState, MEN_22V10,  FALSE);
  408.             DoMethod(main_win, MUIM_Window_SetMenuState, MEN_20RA10, FALSE);
  409.  
  410.             if (GALType == GAL22V10 || GALType == GAL20RA10)
  411.                 SetGALType(GAL16V8);
  412.  
  413.             Config.HardwareVersion = hw_version = HW_GALER_1_0;
  414.             InitHardware();
  415.             break;
  416.  
  417.         case MEN_VER12:
  418.             DoMethod(main_win, MUIM_Window_SetMenuState, MEN_22V10,  FALSE);
  419.             DoMethod(main_win, MUIM_Window_SetMenuState, MEN_20RA10, FALSE);
  420.  
  421.             if (GALType == GAL22V10 || GALType == GAL20RA10)
  422.                 SetGALType(GAL16V8);
  423.  
  424.             Config.HardwareVersion = hw_version = HW_GALER_1_2;
  425.             InitHardware();
  426.             break;
  427.  
  428.         case MEN_VER13:
  429.             DoMethod(main_win, MUIM_Window_SetMenuState, MEN_22V10,  TRUE);
  430.             DoMethod(main_win, MUIM_Window_SetMenuState, MEN_20RA10, TRUE);
  431.  
  432.             Config.HardwareVersion = hw_version = HW_GALER_1_3;
  433.             InitHardware();
  434.             break;
  435.  
  436.         case MEN_VERELEKTOR:
  437.             DoMethod(main_win, MUIM_Window_SetMenuState, MEN_22V10,  TRUE);
  438.             DoMethod(main_win, MUIM_Window_SetMenuState, MEN_20RA10, TRUE);
  439.             DoMethod(main_win, MUIM_Window_SetMenuState, MEN_CALLCHECKER, FALSE);
  440.  
  441.             Config.HardwareVersion = hw_version = HW_ELEKTOR_II;
  442.             InitHardware();
  443.             break;
  444.  
  445.         case MEN_SAVECONFIG:                /* save configuration */
  446.             SaveConfig();
  447.             break;
  448.                                             /* quit is dealed in */
  449.                                             /* the main loop     */
  450.  
  451.                                     /* GAL-type menu */
  452.  
  453.         case MEN_16V8:                      /* GAL16V8 */
  454.             SetGALType(GAL16V8);
  455.             break;
  456.  
  457.         case MEN_20V8:                      /* GAL20V8 */
  458.             SetGALType(GAL20V8);
  459.             break;
  460.  
  461.         case MEN_22V10:                     /* GAL22V10 */
  462.             SetGALType(GAL22V10);
  463.             break;
  464.  
  465.         case MEN_20RA10:                    /* GAL20RA10 */
  466.             SetGALType(GAL20RA10);
  467.             break;
  468.  
  469.         case MEN_TYPEREQ:                   /* type requester */
  470.             Config.GALTypeReq = !Config.GALTypeReq;
  471.             break;
  472.  
  473.  
  474.                                     /* GAL menu */
  475.         case MEN_PROG:
  476.             ProgramGAL();                   /* program GAL */
  477.             break;
  478.  
  479.         case MEN_COPY:                      /* copy */
  480.             CopyGAL();
  481.             break;
  482.  
  483.         case MEN_ERASE:                     /* erase */
  484.             Loeschen();
  485.             break;
  486.  
  487.         case MEN_CMP:                       /* compare */
  488.             Compare();
  489.             break;
  490.  
  491.         case MEN_CLEAR:                     /* is GAL clear */
  492.             Leertest();
  493.             break;
  494.  
  495.         case MEN_SETSEC:                    /* set security bit */
  496.             SetSecurity(YES);
  497.             break;
  498.  
  499.         case MEN_TESTSEC:                   /* test security bit */
  500.             TestSecurity();
  501.             break;
  502.  
  503.         case MEN_WRITE:                     /* how to read/prog GALs */
  504.             Schreibverhalten();
  505.             break;
  506.  
  507.  
  508.                                     /* GAL assembler menu */
  509.         case MEN_ASSEMBLE:
  510.             AssembleInputFile(ASSEMBLER);   /* call assembler */
  511.             break;
  512.  
  513.  
  514.                                     /* GAL disassembler menu */
  515.         case MEN_READSIG:
  516.             PrintSignature();               /* print GAL's signature */
  517.             break;
  518.  
  519.         case MEN_READACW:                   /* print ACW */
  520.             PrintACW();
  521.             break;
  522.  
  523.         case MEN_READINFO:                  /* print some infos */
  524.             GALInfo();                      /* about the GAL    */
  525.             break;
  526.  
  527.         case MEN_READJED:                   /* get JEDEC */
  528.             PutJedec();
  529.             break;
  530.                                             /* parameters for getting JEDEC */
  531.         case MEN_READJEDPARA:
  532.             JedecRequester();
  533.             break;
  534.  
  535.         case MEN_REASM:                     /* call reassembler */
  536.             Reassembler();
  537.             break;
  538.    
  539.  
  540.                                     /* tools menu */
  541.         case MEN_SHOWPIN:
  542.             PrintPinNames();                /* show pin names */
  543.             break;
  544.  
  545.         case MEN_CLEARPIN:                  /* clear pin names */
  546.             ResetPinNames();
  547.             break;
  548.  
  549.         case MEN_CALLCHECKER:               /* switch GAL checker on */
  550.             ToggleChecker();
  551.             break;
  552.  
  553.         case MEN_OPTIMIZER:                 /* optimizer */
  554.             Optimizer();
  555.             break;
  556.  
  557.         case MEN_EDIT:                      /* select editor */
  558.             SelectEditor();
  559.             break;
  560.  
  561.         case MEN_CALLEDIT:                  /* call selected editor */
  562.             CallEditor();
  563.             break;
  564.  
  565.         case MEN_HELP:                      /* help */
  566.             HelpOnHelp();
  567.             break;
  568.  
  569.  
  570.                                     /* GAL checker menu */
  571.         case MEN_EXITCHECKER:
  572.             ToggleChecker();                /* exit GAL checker */
  573.             break;
  574.  
  575.     }
  576. }
  577.  
  578.  
  579.  
  580.  
  581.  
  582. /******************************************************************************
  583. ** GetParPort()
  584. *******************************************************************************
  585. ** input:   none
  586. **
  587. ** output:  TRUE:  ok
  588. **          FALSE: parallel port in use
  589. **
  590. ** remarks: allocate Amiga's parallel port
  591. ******************************************************************************/
  592.  
  593. static int GetParPort(void)
  594. {
  595.  
  596.                                         /* get parallel port */
  597.  
  598.     if (!(MiscBase = (struct Library *)OpenResource(MISCNAME)))
  599.     {
  600.         return FALSE;
  601.     }
  602.  
  603.  
  604.     if (AllocMiscResource(MR_PARALLELPORT, prog_name))
  605.     {
  606.         return FALSE;
  607.     }
  608.  
  609.  
  610.     if (AllocMiscResource(MR_PARALLELBITS, prog_name))
  611.     {
  612.         FreeMiscResource(MR_PARALLELPORT);
  613.         return FALSE;
  614.     }
  615.  
  616.  
  617.  
  618.     InitParPort();                      /* init data direction register */
  619.  
  620.     return TRUE;
  621. }
  622.  
  623.  
  624.  
  625.  
  626.  
  627. /******************************************************************************
  628. ** FreeParPort()
  629. *******************************************************************************
  630. ** input:   none
  631. ** output:  none
  632. **
  633. ** remarks: free Amiga's parallel port
  634. ******************************************************************************/
  635.  
  636. static void FreeParPort(void)
  637. {
  638.  
  639.     RestoreParPort();                       /* restore the state of the */
  640.                                             /* parallel port            */
  641.  
  642.     FreeMiscResource(MR_PARALLELBITS);      /* free parallel port */
  643.     FreeMiscResource(MR_PARALLELPORT);
  644.  
  645. }
  646.  
  647.  
  648.  
  649.  
  650.  
  651. /******************************************************************************
  652. ** GetCIATimer()
  653. *******************************************************************************
  654. ** input:   none
  655. ** output:  TRUE:  o.k.
  656. **          FALSE: failed to get any CIA timer
  657. **
  658. ** remarks: try to get one of the four CIA timers and initialize it
  659. ******************************************************************************/
  660.  
  661. static int GetCIATimer(void)
  662. {
  663.  
  664.  
  665.                             /* at first try to get one of the CIA-A timers */
  666.  
  667.     if ((CIABase = (struct Library *)OpenResource(CIAANAME)))
  668.     {
  669.                                             /* try to get timer A          */
  670.                                             /* (interrupt is just a dummy) */
  671.  
  672.         if (!(AddICRVector(CIABase, CIAICRB_TA, &CIATimerInterrupt)))
  673.         {
  674.             AbleICR(CIABase, CIAICRB_TA);       /* disable timer A interrupt */
  675.  
  676.             selected_timer = CIAICRB_TA;
  677.  
  678.             cia_timer_low  = &ciaa.ciatalo;     /* init some variables */
  679.             cia_timer_high = &ciaa.ciatahi;
  680.             cia_timer_cr   = &ciaa.ciacra;
  681.  
  682.             cia_timer_start = ciaa.ciacra & (CIACRAF_SPMODE | CIACRAF_TODIN) |
  683.                               CIACRAF_START | CIACRAF_LOAD;
  684.  
  685.             cia_timer_stop  = cia_timer_start & ~CIACRAF_START;
  686.  
  687.             return TRUE;
  688.         }
  689.                                             /* try to get timer B */
  690.  
  691.         if (!(AddICRVector(CIABase, CIAICRB_TB, &CIATimerInterrupt)))
  692.         {
  693.             AbleICR(CIABase, CIAICRB_TB);       /* disable timer B interrupt */
  694.  
  695.             selected_timer = CIAICRB_TB;
  696.  
  697.             cia_timer_low  = &ciaa.ciatblo;     /* init some variables */
  698.             cia_timer_high = &ciaa.ciatbhi;
  699.             cia_timer_cr   = &ciaa.ciacrb;
  700.  
  701.             cia_timer_start = ciaa.ciacrb & CIACRBF_ALARM |
  702.                               CIACRBF_START | CIACRBF_LOAD;
  703.  
  704.             cia_timer_stop  = cia_timer_start & ~CIACRBF_START;
  705.  
  706.             return TRUE;
  707.         }
  708.  
  709.     }
  710.  
  711.  
  712.                             /* now try to get one of the CIA-B timers */
  713.  
  714.     if ((CIABase = (struct Library *)OpenResource(CIABNAME)))
  715.     {
  716.                                             /* try to get timer A          */
  717.  
  718.         if (!(AddICRVector(CIABase, CIAICRB_TA, &CIATimerInterrupt)))
  719.         {
  720.             AbleICR(CIABase, CIAICRB_TA);       /* disable timer A interrupt */
  721.  
  722.             selected_timer = CIAICRB_TA;
  723.  
  724.             cia_timer_low  = &ciab.ciatalo;     /* init some variables */
  725.             cia_timer_high = &ciab.ciatahi;
  726.             cia_timer_cr   = &ciab.ciacra;
  727.  
  728.             cia_timer_start = ciab.ciacra & (CIACRAF_SPMODE | CIACRAF_TODIN) |
  729.                               CIACRAF_START | CIACRAF_LOAD;
  730.  
  731.             cia_timer_stop  = cia_timer_start & ~CIACRAF_START;
  732.  
  733.             return TRUE;
  734.         }
  735.                                             /* try to get timer B */
  736.  
  737.         if (!(AddICRVector(CIABase, CIAICRB_TB, &CIATimerInterrupt)))
  738.         {
  739.             AbleICR(CIABase, CIAICRB_TB);       /* disable timer B interrupt */
  740.  
  741.             selected_timer = CIAICRB_TB;
  742.  
  743.             cia_timer_low  = &ciab.ciatblo;     /* init some variables */
  744.             cia_timer_high = &ciab.ciatbhi;
  745.             cia_timer_cr   = &ciab.ciacrb;
  746.  
  747.             cia_timer_start = ciab.ciacrb & CIACRBF_ALARM |
  748.                               CIACRBF_START | CIACRBF_LOAD;
  749.  
  750.             cia_timer_stop  = cia_timer_start & ~CIACRBF_START;
  751.  
  752.             return TRUE;
  753.         }
  754.  
  755.     }
  756.  
  757.  
  758.     return FALSE;
  759. }
  760.  
  761.  
  762.  
  763.  
  764.  
  765. /******************************************************************************
  766. ** FreeCIATimer()
  767. *******************************************************************************
  768. ** input:   none
  769. ** output:  none
  770. **
  771. ** remarks: free CIA timer
  772. ******************************************************************************/
  773.  
  774. static void FreeCIATimer(void)
  775. {
  776.  
  777.     RemICRVector(CIABase, selected_timer, &CIATimerInterrupt);
  778.  
  779. }
  780.  
  781.  
  782.  
  783.  
  784.  
  785. /******************************************************************************
  786. ** dummy_interrupt()
  787. *******************************************************************************
  788. ** input:   none
  789. ** output:  none
  790. **
  791. ** remarks: This is just a dummy function. It's needed for the interrupt
  792. **          structure necessary to test whether or not a CIA timer is free.
  793. **          __interrupt is a SAS-C keyword. This keyword turns off stack
  794. **          checking.
  795. ******************************************************************************/
  796.  
  797. __interrupt static void dummy_interrupt(void)
  798. {
  799.     return;
  800. }
  801.  
  802.  
  803.  
  804.  
  805.  
  806. /******************************************************************************
  807. ** GetTimer()
  808. *******************************************************************************
  809. ** input:   none
  810. **
  811. ** output:  TRUE:  ok
  812. **          FALSE: failed
  813. **
  814. ** remarks: open timer device
  815. ******************************************************************************/
  816.  
  817. static int GetTimer(void)
  818. {
  819.  
  820.     timeport = (struct MsgPort *)CreatePort(0L, 0L);
  821.  
  822.     if (timeport == NULL)
  823.         return FALSE;
  824.  
  825.  
  826.     timereq = (struct timerequest *)AllocMem((long)sizeof(struct timerequest),
  827.                                            MEMF_PUBLIC);
  828.  
  829.     if (timereq == NULL)
  830.     {
  831.         DeletePort(timeport);
  832.         return FALSE;
  833.     }
  834.  
  835.  
  836.     timereq->tr_node.io_Message.mn_Node.ln_Type = NT_MESSAGE;
  837.     timereq->tr_node.io_Message.mn_Node.ln_Pri  = 0;
  838.     timereq->tr_node.io_Message.mn_ReplyPort    = timeport;
  839.  
  840.  
  841.     if (OpenDevice(TIMERNAME, UNIT_MICROHZ, (struct IORequest *)timereq, 0L))
  842.     {
  843.         FreeMem(&timereq, (long)sizeof(struct timerequest));
  844.         DeletePort (timeport);
  845.         return FALSE;
  846.     }
  847.  
  848.     return TRUE;
  849. }
  850.  
  851.  
  852.  
  853.  
  854.  
  855. /******************************************************************************
  856. ** FreeTimer()
  857. *******************************************************************************
  858. ** input:   none
  859. ** output:  none
  860. **
  861. ** remarks: free the timer device
  862. ******************************************************************************/
  863.  
  864. static void FreeTimer(void)
  865. {
  866.  
  867.     CloseDevice((struct IORequest *)timereq);
  868.  
  869.     FreeMem(timereq, (long)sizeof(struct timerequest));
  870.  
  871.     DeletePort(timeport);
  872. }
  873.  
  874.  
  875.  
  876.  
  877.  
  878. /******************************************************************************
  879. ** OpenStuff()
  880. *******************************************************************************
  881. ** input:   none
  882. **
  883. ** output:  TRUE:  ok
  884. **          FALSE: something failed
  885. **
  886. ** remarks: does open all libraries and the MUI application
  887. ******************************************************************************/
  888.  
  889. static int OpenStuff(void)
  890. {
  891.     int    n;
  892.     LONG   open;
  893.  
  894.  
  895.  
  896.     if ((LocaleBase = OpenLibrary("locale.library", 38L)))
  897.         catalog = OpenCatalog(NULL, (STRPTR)"GALer.catalog", OC_Version, 2,
  898.                               TAG_DONE);
  899.  
  900.     LocalizeText();
  901.  
  902.  
  903.     if (!(ReqToolsBase = (struct ReqToolsBase *)OpenLibrary(REQTOOLSNAME,
  904.                                                 REQTOOLSVERSION)))
  905.     {
  906.         puts((char *)AppStrings[MSG_ERR_REQTOOLSLIB].as_Str);
  907.         return FALSE;
  908.     }
  909.  
  910.  
  911.     if (!(filereq = rtAllocRequestA(RT_FILEREQ, NULL)))
  912.     {
  913.         puts((char *)AppStrings[MSG_ERR_FILEREQ].as_Str);
  914.         return FALSE;
  915.     }
  916.  
  917.  
  918.     if (!(MUIMasterBase = OpenLibrary(MUIMASTER_NAME, MUIMASTER_VMIN)))
  919.     {
  920.         puts((char *)AppStrings[MSG_ERR_MUILIB].as_Str);
  921.         return FALSE;
  922.     }
  923.  
  924.  
  925.  
  926.     app = ApplicationObject,
  927.             MUIA_Application_Title,       "GALer",
  928.             MUIA_Application_Version,     "$VER: GALer 2.1 (27.04.1996)",
  929.             MUIA_Application_Copyright,   "©1991/96, Christian Habermann",
  930.             MUIA_Application_Author,      "Christian Habermann",
  931.             MUIA_Application_Description, "Software to program GALs.",
  932.             MUIA_Application_Base,        "GALER",
  933.             MUIA_Application_HelpFile,    HELP_FILE,
  934.  
  935.             MUIA_Application_Menustrip,   menustrip =
  936.                                               MUI_MakeObject(MUIO_MenustripNM,
  937.                                                              MainMenu, 0),
  938.  
  939.             SubWindow, main_win = WindowObject,
  940.                 MUIA_Window_Title, main_win_title,
  941.                 MUIA_Window_ID,    MAKE_ID('G','A','L','E'),
  942.                 MUIA_HelpNode,     "Main",
  943.  
  944.                 WindowContents, GroupObject,
  945.  
  946.                     Child, ColGroup(6), GroupFrameT("GAL"),
  947.                         MUIA_Group_VertSpacing, 0,
  948.  
  949.                                         /* pins 1 and 24 */
  950.                             Child, GAL_gads[0] = SimpleButton("L"),
  951.  
  952.                             Child, GAL_txt[0] = TextObject,
  953.                                 MUIA_Background, MUII_TextBack,
  954.                                 MUIA_Frame, MUIV_Frame_Text,
  955.                                 MUIA_Text_Contents, "\33rnoname  \33b1",
  956.                                 MUIA_Text_SetMin, TRUE,
  957.                                 End,
  958.  
  959.                             Child, GAL_txt[23] = TextObject,
  960.                                 MUIA_Background, MUII_TextBack,
  961.                                 MUIA_Frame, MUIV_Frame_Text,
  962.                                 MUIA_Text_Contents, "\33b24\33n noname",
  963.                                 MUIA_Text_SetMin, TRUE,
  964.                                 End,
  965.  
  966.                             Child, HSpace(0),
  967.  
  968.                             Child, HSpace(0),
  969.  
  970.                             Child, HSpace(0),
  971.  
  972.  
  973.                                         /* pins 2 and 23 */
  974.                             Child, GAL_gads[1] = SimpleButton("L"),
  975.  
  976.                             Child, GAL_txt[1] = TextObject,
  977.                                 MUIA_Background, MUII_TextBack,
  978.                                 MUIA_Frame, MUIV_Frame_Text,
  979.                                 MUIA_Text_Contents, "\33rnoname  \33b2",
  980.                                 MUIA_Text_SetMin, TRUE,
  981.                                 End,
  982.  
  983.                             Child, GAL_txt[22] = TextObject,
  984.                                 MUIA_Background, MUII_TextBack,
  985.                                 MUIA_Frame, MUIV_Frame_Text,
  986.                                 MUIA_Text_Contents, "\33b23\33n noname",
  987.                                 MUIA_Text_SetMin, TRUE,
  988.                                 End,
  989.  
  990.                             Child, GAL_txt[33] = TextObject,
  991.                                 MUIA_Background, MUII_TextBack,                               MUIA_Frame, MUIV_Frame_None,
  992.                                 MUIA_Text_Contents, "Z",
  993.                                 MUIA_Text_SetMin, TRUE,
  994.                                 MUIA_Text_SetMax, TRUE,
  995.                                 End,
  996.  
  997.                             Child, GAL_gads[21] = SimpleButton("L"),
  998.  
  999.                             Child, GAL_gads[31] = SimpleButton("O"),
  1000.  
  1001.  
  1002.                                         /* pins 3 and 22 */
  1003.                             Child, GAL_gads[2] = SimpleButton("L"),
  1004.  
  1005.                             Child, GAL_txt[2] = TextObject,
  1006.                                 MUIA_Background, MUII_TextBack,
  1007.                                 MUIA_Frame, MUIV_Frame_Text,
  1008.                                 MUIA_Text_Contents, "\33rnoname  \33b3",
  1009.                                 MUIA_Text_SetMin, TRUE,
  1010.                                 End,
  1011.  
  1012.                             Child, GAL_txt[21] = TextObject,
  1013.                                 MUIA_Background, MUII_TextBack,
  1014.                                 MUIA_Frame, MUIV_Frame_Text,
  1015.                                 MUIA_Text_Contents, "\33b22\33n noname",
  1016.                                 MUIA_Text_SetMin, TRUE,
  1017.                                 End,
  1018.  
  1019.                             Child, GAL_txt[32] = TextObject,
  1020.                                 MUIA_Background, MUII_TextBack,
  1021.                                 MUIA_Frame, MUIV_Frame_None,
  1022.                                 MUIA_Text_Contents, "Z",
  1023.                                 MUIA_Text_SetMin, TRUE,
  1024.                                 MUIA_Text_SetMax, TRUE,
  1025.                                 End,
  1026.  
  1027.                             Child, GAL_gads[20] = SimpleButton("L"),
  1028.  
  1029.                             Child, GAL_gads[30] = SimpleButton("O"),
  1030.  
  1031.  
  1032.                                         /* pins 4 and 21 */
  1033.                             Child, GAL_gads[3] = SimpleButton("L"),
  1034.  
  1035.                             Child, GAL_txt[3] = TextObject,
  1036.                                 MUIA_Background, MUII_TextBack,
  1037.                                 MUIA_Frame, MUIV_Frame_Text,
  1038.                                 MUIA_Text_Contents, "\33rnoname  \33b4",
  1039.                                 MUIA_Text_SetMin, TRUE,
  1040.                                 End,
  1041.  
  1042.                             Child, GAL_txt[20] = TextObject,
  1043.                                 MUIA_Background, MUII_TextBack,
  1044.                                 MUIA_Frame, MUIV_Frame_Text,
  1045.                                 MUIA_Text_Contents, "\33b21\33n noname",
  1046.                                 MUIA_Text_SetMin, TRUE,
  1047.                                 End,
  1048.  
  1049.                             Child, GAL_txt[31] = TextObject,
  1050.                                 MUIA_Background, MUII_TextBack,
  1051.                                 MUIA_Frame, MUIV_Frame_None,
  1052.                                 MUIA_Text_Contents, "Z",
  1053.                                 MUIA_Text_SetMin, TRUE,
  1054.                                 MUIA_Text_SetMax, TRUE,
  1055.                                 End,
  1056.  
  1057.                             Child, GAL_gads[19] = SimpleButton("L"),
  1058.  
  1059.                             Child, GAL_gads[29] = SimpleButton("O"),
  1060.  
  1061.  
  1062.                                         /* pins 5 and 20 */
  1063.                             Child, GAL_gads[4] = SimpleButton("L"),
  1064.  
  1065.                             Child, GAL_txt[4] = TextObject,
  1066.                                 MUIA_Background, MUII_TextBack,
  1067.                                 MUIA_Frame, MUIV_Frame_Text,
  1068.                                 MUIA_Text_Contents, "\33rnoname  \33b5",
  1069.                                 MUIA_Text_SetMin, TRUE,
  1070.                                 End,
  1071.  
  1072.                             Child, GAL_txt[19] = TextObject,
  1073.                                 MUIA_Background, MUII_TextBack,
  1074.                                 MUIA_Frame, MUIV_Frame_Text,
  1075.                                 MUIA_Text_Contents, "\33b20\33n noname",
  1076.                                 MUIA_Text_SetMin, TRUE,
  1077.                                 End,
  1078.  
  1079.                             Child, GAL_txt[30] = TextObject,
  1080.                                 MUIA_Background, MUII_TextBack,
  1081.                                 MUIA_Frame, MUIV_Frame_None,
  1082.                                 MUIA_Text_Contents, "Z",
  1083.                                 MUIA_Text_SetMin, TRUE,
  1084.                                 MUIA_Text_SetMax, TRUE,
  1085.                                 End,
  1086.  
  1087.                             Child, GAL_gads[18] = SimpleButton("L"),
  1088.  
  1089.                             Child, GAL_gads[28] = SimpleButton("O"),
  1090.  
  1091.  
  1092.                                         /* pins 6 and 19 */
  1093.                             Child, GAL_gads[5] = SimpleButton("L"),
  1094.  
  1095.                             Child, GAL_txt[5] = TextObject,
  1096.                                 MUIA_Background, MUII_TextBack,
  1097.                                 MUIA_Frame, MUIV_Frame_Text,
  1098.                                 MUIA_Text_Contents, "\33rnoname  \33b6",
  1099.                                 MUIA_Text_SetMin, TRUE,
  1100.                                 End,
  1101.  
  1102.                             Child, GAL_txt[18] = TextObject,
  1103.                                 MUIA_Background, MUII_TextBack,
  1104.                                 MUIA_Frame, MUIV_Frame_Text,
  1105.                                 MUIA_Text_Contents, "\33b19\33n noname",
  1106.                                 MUIA_Text_SetMin, TRUE,
  1107.                                 End,
  1108.  
  1109.                             Child, GAL_txt[29] = TextObject,
  1110.                                 MUIA_Background, MUII_TextBack,
  1111.                                 MUIA_Frame, MUIV_Frame_None,
  1112.                                 MUIA_Text_Contents, "Z",
  1113.                                 MUIA_Text_SetMin, TRUE,
  1114.                                 MUIA_Text_SetMax, TRUE,
  1115.                                 End,
  1116.  
  1117.                             Child, GAL_gads[17] = SimpleButton("L"),
  1118.  
  1119.                             Child, GAL_gads[27] = SimpleButton("O"),
  1120.  
  1121.  
  1122.                                         /* pins 7 and 18 */
  1123.                             Child, GAL_gads[6] = SimpleButton("L"),
  1124.  
  1125.                             Child, GAL_txt[6] = TextObject,
  1126.                                 MUIA_Background, MUII_TextBack,
  1127.                                 MUIA_Frame, MUIV_Frame_Text,
  1128.                                 MUIA_Text_Contents, "\33rnoname  \33b7",
  1129.                                 MUIA_Text_SetMin, TRUE,
  1130.                                 End,
  1131.  
  1132.                             Child, GAL_txt[17] = TextObject,
  1133.                                 MUIA_Background, MUII_TextBack,
  1134.                                 MUIA_Frame, MUIV_Frame_Text,
  1135.                                 MUIA_Text_Contents, "\33b18\33n noname",
  1136.                                 MUIA_Text_SetMin, TRUE,
  1137.                                 End,
  1138.  
  1139.                             Child, GAL_txt[28] = TextObject,
  1140.                                 MUIA_Background, MUII_TextBack,
  1141.                                 MUIA_Frame, MUIV_Frame_None,
  1142.                                 MUIA_Text_Contents, "Z",
  1143.                                 MUIA_Text_SetMin, TRUE,
  1144.                                 MUIA_Text_SetMax, TRUE,
  1145.                                 End,
  1146.  
  1147.                             Child, GAL_gads[16] = SimpleButton("L"),
  1148.  
  1149.                             Child, GAL_gads[26] = SimpleButton("O"),
  1150.  
  1151.  
  1152.                                         /* pins 8 and 17 */
  1153.                             Child, GAL_gads[7] = SimpleButton("L"),
  1154.  
  1155.                             Child, GAL_txt[7] = TextObject,
  1156.                                 MUIA_Background, MUII_TextBack,
  1157.                                 MUIA_Frame, MUIV_Frame_Text,
  1158.                                 MUIA_Text_Contents, "\33rnoname  \33b8",
  1159.                                 MUIA_Text_SetMin, TRUE,
  1160.                                 End,
  1161.  
  1162.                             Child, GAL_txt[16] = TextObject,
  1163.                                 MUIA_Background, MUII_TextBack,
  1164.                                 MUIA_Frame, MUIV_Frame_Text,
  1165.                                 MUIA_Text_Contents, "\33b17\33n noname",
  1166.                                 MUIA_Text_SetMin, TRUE,
  1167.                                 End,
  1168.  
  1169.                             Child, GAL_txt[27] = TextObject,
  1170.                                 MUIA_Background, MUII_TextBack,
  1171.                                 MUIA_Frame, MUIV_Frame_None,
  1172.                                 MUIA_Text_Contents, "Z",
  1173.                                 MUIA_Text_SetMin, TRUE,
  1174.                                 MUIA_Text_SetMax, TRUE,
  1175.                                 End,
  1176.  
  1177.                             Child, GAL_gads[15] = SimpleButton("L"),
  1178.  
  1179.                             Child, GAL_gads[25] = SimpleButton("O"),
  1180.  
  1181.  
  1182.                                         /* pins 9 and 16 */
  1183.                             Child, GAL_gads[8] = SimpleButton("L"),
  1184.  
  1185.                             Child, GAL_txt[8] = TextObject,
  1186.                                 MUIA_Background, MUII_TextBack,
  1187.                                 MUIA_Frame, MUIV_Frame_Text,
  1188.                                 MUIA_Text_Contents, "\33rnoname  \33b9",
  1189.                                 MUIA_Text_SetMin, TRUE,
  1190.                                 End,
  1191.  
  1192.                             Child, GAL_txt[15] = TextObject,
  1193.                                 MUIA_Background, MUII_TextBack,
  1194.                                 MUIA_Frame, MUIV_Frame_Text,
  1195.                                 MUIA_Text_Contents, "\33b16\33n noname",
  1196.                                 MUIA_Text_SetMin, TRUE,
  1197.                                 End,
  1198.  
  1199.                             Child, GAL_txt[26] = TextObject,
  1200.                                 MUIA_Background, MUII_TextBack,
  1201.                                 MUIA_Frame, MUIV_Frame_None,
  1202.                                 MUIA_Text_Contents, "Z",
  1203.                                 MUIA_Text_SetMin, TRUE,
  1204.                                 MUIA_Text_SetMax, TRUE,
  1205.                                 End,
  1206.  
  1207.                             Child, GAL_gads[14] = SimpleButton("L"),
  1208.  
  1209.                             Child, GAL_gads[24] = SimpleButton("O"),
  1210.  
  1211.  
  1212.                                         /* pins 10 and 15 */
  1213.                             Child, GAL_gads[9] = SimpleButton("L"),
  1214.  
  1215.                             Child, GAL_txt[9] = TextObject,
  1216.                                 MUIA_Background, MUII_TextBack,
  1217.                                 MUIA_Frame, MUIV_Frame_Text,
  1218.                                 MUIA_Text_Contents, "\33rnoname \33b10",
  1219.                                 MUIA_Text_SetMin, TRUE,
  1220.                                 End,
  1221.  
  1222.                             Child, GAL_txt[14] = TextObject,
  1223.                                 MUIA_Background, MUII_TextBack,
  1224.                                 MUIA_Frame, MUIV_Frame_Text,
  1225.                                 MUIA_Text_Contents, "\33b15\33n noname",
  1226.                                 MUIA_Text_SetMin, TRUE,
  1227.                                 End,
  1228.  
  1229.                             Child, GAL_txt[25] = TextObject,
  1230.                                 MUIA_Background, MUII_TextBack,
  1231.                                 MUIA_Frame, MUIV_Frame_None,
  1232.                                 MUIA_Text_Contents, "Z",
  1233.                                 MUIA_Text_SetMin, TRUE,
  1234.                                 MUIA_Text_SetMax, TRUE,
  1235.                                 End,
  1236.  
  1237.                             Child, GAL_gads[13] = SimpleButton("L"),
  1238.  
  1239.                             Child, GAL_gads[23] = SimpleButton("O"),
  1240.  
  1241.  
  1242.                                         /* pins 11 and 14 */
  1243.                             Child, GAL_gads[10] = SimpleButton("L"),
  1244.  
  1245.                             Child, GAL_txt[10] = TextObject,
  1246.                                 MUIA_Background, MUII_TextBack,
  1247.                                 MUIA_Frame, MUIV_Frame_Text,
  1248.                                 MUIA_Text_Contents, "\33rnoname \33b11",
  1249.                                 MUIA_Text_SetMin, TRUE,
  1250.                                 End,
  1251.  
  1252.                             Child, GAL_txt[13] = TextObject,
  1253.                                 MUIA_Background, MUII_TextBack,
  1254.                                 MUIA_Frame, MUIV_Frame_Text,
  1255.                                 MUIA_Text_Contents, "\33b14\33n noname",
  1256.                                 MUIA_Text_SetMin, TRUE,
  1257.                                 End,
  1258.  
  1259.                             Child, GAL_txt[24] = TextObject,
  1260.                                 MUIA_Background, MUII_TextBack,
  1261.                                 MUIA_Frame, MUIV_Frame_None,
  1262.                                 MUIA_Text_Contents, "Z",
  1263.                                 MUIA_Text_SetMin, TRUE,
  1264.                                 MUIA_Text_SetMax, TRUE,
  1265.                                 End,
  1266.  
  1267.                             Child, GAL_gads[12] = SimpleButton("L"),
  1268.  
  1269.                             Child, GAL_gads[22] = SimpleButton("O"),
  1270.  
  1271.  
  1272.                                         /* pins 12 and 13 */
  1273.                             Child, HSpace(0), 
  1274.  
  1275.                             Child, GAL_txt[11] = TextObject,
  1276.                                 MUIA_Background, MUII_TextBack,
  1277.                                 MUIA_Frame, MUIV_Frame_Text,
  1278.                                 MUIA_Text_Contents, "\33rnoname \33b12",
  1279.                                 MUIA_Text_SetMin, TRUE,
  1280.                                 End,
  1281.  
  1282.                             Child, GAL_txt[12] = TextObject,
  1283.                                 MUIA_Background, MUII_TextBack,
  1284.                                 MUIA_Frame, MUIV_Frame_Text,
  1285.                                 MUIA_Text_Contents, "\33b13\33n noname",
  1286.                                 MUIA_Text_SetMin, TRUE,
  1287.                                 End,
  1288.  
  1289.                             Child, HSpace(0),
  1290.  
  1291.                             Child, GAL_gads[11] = SimpleButton("L"),
  1292.  
  1293.                             Child, HSpace(0),
  1294.                     End,
  1295.  
  1296.  
  1297.                     Child, LV_text = ListviewObject,
  1298.                         MUIA_Listview_Input, FALSE,
  1299.                         MUIA_Listview_List, ListObject,
  1300.                         MUIA_List_ConstructHook, MUIV_List_ConstructHook_String,
  1301.                         MUIA_List_DestructHook, MUIV_List_DestructHook_String,
  1302.                         ReadListFrame,
  1303.                         End,
  1304.                     End,
  1305.                 End,
  1306.             End,
  1307.         End;
  1308.  
  1309.                                 /* checker menu */
  1310.  
  1311.     menu_checker = MenuObject, MUIA_Menu_Title,
  1312.                                  AppStrings[MSG_CHECKER_MENU1].as_Str,
  1313.         MUIA_Family_Child, MUI_MakeObject(MUIO_Menuitem,
  1314.                             AppStrings[MSG_CHECKER_MENU1_ITEM1].as_Str,
  1315.                             AppStrings[MSG_CHECKER_MENU1_ITEM1_COMMKEY].as_Str,
  1316.                             0, MEN_EXITCHECKER),
  1317.         End;
  1318.  
  1319.  
  1320.  
  1321.  
  1322.  
  1323.                                     /* set gadget IDs of all */
  1324.                                     /* GAL gadgets           */
  1325.  
  1326.     for (n = 0; n < NUM_OF_GAL_GADGETS; n++)
  1327.         DoMethod(GAL_gads[n], MUIM_Notify, MUIA_Pressed, FALSE,
  1328.                  app, 2, MUIM_Application_ReturnID, FIRST_GAL_GADID + n);
  1329.  
  1330.  
  1331.  
  1332.  
  1333.     if (!app || !menu_checker)
  1334.     {
  1335.         puts((char *)AppStrings[MSG_ERR_APPLICATION].as_Str);
  1336.         return FALSE;
  1337.     }
  1338.  
  1339.                        /* get pointers to the menu objects of the main menu */
  1340.                        /* with this pointers the main menu can be removed   */
  1341.                        /* and the GAL checker menu can be added             */
  1342.  
  1343.     menu_project = (APTR)DoMethod(menustrip, MUIM_FindUData, MEN_PROJECT);
  1344.     menu_galtype = (APTR)DoMethod(menustrip, MUIM_FindUData, MEN_GALTYPE);
  1345.     menu_gal     = (APTR)DoMethod(menustrip, MUIM_FindUData, MEN_GAL);
  1346.     menu_asm     = (APTR)DoMethod(menustrip, MUIM_FindUData, MEN_GALASM);
  1347.     menu_galdis  = (APTR)DoMethod(menustrip, MUIM_FindUData, MEN_GALDIS);
  1348.     menu_tools   = (APTR)DoMethod(menustrip, MUIM_FindUData, MEN_TOOLS);
  1349.  
  1350.                                         /* show menu help text when the user */
  1351.                                         /* does press the HELP-key while the */
  1352.                                         /* mouse is over a menu item         */
  1353.  
  1354.     DoMethod(app, MUIM_Notify, MUIA_Application_MenuHelp, MUIV_EveryTime,
  1355.              app, 5, MUIM_Application_ShowHelp, main_win, HELP_FILE,
  1356.              "Menus", 0);
  1357.  
  1358.                                         /* let GALer know when the close */
  1359.                                         /* gadget is selected            */
  1360.  
  1361.     DoMethod(main_win, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
  1362.              app, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
  1363.  
  1364.  
  1365.  
  1366.  
  1367.     set(main_win, MUIA_Window_Open, TRUE);        /* open the main window */
  1368.     get(main_win, MUIA_Window_Open, &open);
  1369.  
  1370.     if (!open)
  1371.     {
  1372.         puts((char *)AppStrings[MSG_ERR_OPENWINDOW].as_Str);
  1373.         return FALSE;
  1374.     }
  1375.  
  1376.  
  1377.  
  1378.  
  1379.     return TRUE;
  1380. }
  1381.  
  1382.  
  1383.  
  1384.  
  1385.  
  1386. /******************************************************************************
  1387. ** CloseStuff()
  1388. *******************************************************************************
  1389. ** input:   none
  1390. ** output:  none
  1391. **
  1392. ** remarks: close libraries and the MUI application
  1393. ******************************************************************************/
  1394.  
  1395. static void CloseStuff(void)
  1396. {
  1397.  
  1398.     if (filereq)
  1399.         rtFreeRequest(filereq);
  1400.  
  1401.     if (ReqToolsBase)
  1402.         CloseLibrary((struct Library *)ReqToolsBase);
  1403.  
  1404.     if (LocaleBase)
  1405.     {
  1406.         CloseCatalog(catalog);
  1407.         CloseLibrary (LocaleBase);
  1408.     }
  1409.  
  1410.  
  1411.     if (app)                                /* close MUI application */
  1412.         MUI_DisposeObject(app);
  1413.  
  1414.     if (MUIMasterBase)
  1415.         CloseLibrary(MUIMasterBase);
  1416.  
  1417. }
  1418.  
  1419.  
  1420.  
  1421.  
  1422.  
  1423. /* EOF */
  1424.